/*
 * MailAcceptance.java
 *
 * Created on June 2, 2007, 11:08 AM
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */
package hero.hook;

/**
 *
 * @author kabad
 */
import hero.interfaces.*;
import hero.interfaces.BnNodeLocal;
import hero.util.BonitaServiceException;
import hero.util.HeroHookException;
import hero.util.BonitaServiceLocator;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Address;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.util.*;

public class MailNotificacion implements hero.hook.NodeHookI {

    final String solicitarSerAyudante = "Solicitar Ayudantia";
    final String solicitarAyudantes = "Solicitar Ayudantes";
    final String solicitarCambio = "Solicitar Cambio de Carrera o Especializacion";
    final String solicitarConvalidacion = "Solicitar Convalidacion de Materia";
    final String solicitarAperturaTopico = "Solicitar Apertura Topico";
    final String solicitarAperturaPostgrado = "Solicitar Apertura Postgrado";

    /** Creates a new instance of MailAcceptance */
    public MailNotificacion() {
//         try {
//            initial=new InitialContext();
//            cache = new HashMap();
//        } catch (javax.naming.NamingException ne) {
//            System.out.println("Problemas en la clase: "+ne);
//            //throw new BonitaServiceException(ne.getMessage());
//        }
    }

    public String getMetadata() {
        return Constants.Nd.BEFORETERMINATE;
    }

    public void create(Object b, BnNodeLocal n) throws HeroHookException {
    }

    public void beforeStart(Object b, BnNodeLocal n) throws HeroHookException {
    }

    public void afterTerminate(Object b, BnNodeLocal n) throws HeroHookException {
    }

    public void onCancel(Object b, BnNodeLocal n) throws HeroHookException {
    }

    public void anticipate(Object b, BnNodeLocal n) throws HeroHookException {
    }

    public void onDeadline(Object b, BnNodeLocal n) throws HeroHookException {
    }

    public void afterStart(Object b, BnNodeLocal n) throws HeroHookException {
    }

    public void onReady(Object b, BnNodeLocal n) throws HeroHookException {
        try {
            String nodeName = n.getName();
            System.out.println("la actividad se llama " + nodeName);
            BnProjectLocal project = n.getBnProject();
            String prjName = project.getName();

            ProjectSessionLocalHome prjhome = (ProjectSessionLocalHome) ProjectSessionUtil.getLocalHome();
            ProjectSessionLocal prjSession = prjhome.create();
            prjSession.initProject(prjName);
            int indice = prjName.indexOf("_");
            String nombreModelo = prjName.substring(0, indice);
            System.out.println("el MODELO" + nombreModelo);

            String usuarioAsignado;
            Vector<String> mails = new Vector<String>();
            if (nombreModelo.equals(this.solicitarConvalidacion)) {
                if (nodeName.equals("Emitir informe")) {
                    usuarioAsignado = n.getActivityPerformer();
                    for (Object item : n.getBnRole().getBnUsers()) {
                        BnUserLocal user = (BnUserLocal) item;
                        if (usuarioAsignado.equals(user.getName())) {
                            mails.add(user.getEmail());
                            System.out.println("el nombre del usuario asignado es: " + user.getName() + "      correo: " + user.getEmail());
                        }
                    }
                } else {
                    for (Object item : n.getBnRole().getBnUsers()) {
                        BnUserLocal user = (BnUserLocal) item;
                        mails.add(user.getEmail());
                        System.out.println("el nombre del usuario: " + user.getName() + "      correo: " + user.getEmail());
                    }
                }

            } else if (nombreModelo.equals(this.solicitarCambio)) {
                if (nodeName.equals("Emitir informe")) {
                    usuarioAsignado = n.getActivityPerformer();
                    for (Object item : n.getBnRole().getBnUsers()) {
                        BnUserLocal user = (BnUserLocal) item;
                        if (usuarioAsignado.equals(user.getName())) {
                            mails.add(user.getEmail());
                            System.out.println("el nombre del usuario asignado es: " + user.getName() + "      correo: " + user.getEmail());
                        }
                    }
                } else {
                    for (Object item : n.getBnRole().getBnUsers()) {
                        BnUserLocal user = (BnUserLocal) item;
                        mails.add(user.getEmail());
                        System.out.println("el nombre del usuario: " + user.getName() + "      correo: " + user.getEmail());
                    }
                }
            } else if (nombreModelo.equals(this.solicitarAperturaPostgrado) || nombreModelo.equals(this.solicitarAperturaTopico)) {
                if (nodeName.equals("Emitir informe evaluador1") || nodeName.equals("Emitir informe evaluador2") || nodeName.equals("Emitir informe evaluador3")) {
                    usuarioAsignado = n.getActivityPerformer();
                    for (Object item : n.getBnRole().getBnUsers()) {
                        BnUserLocal user = (BnUserLocal) item;
                        if (usuarioAsignado.equals(user.getName())) {
                            mails.add(user.getEmail());
                            System.out.println("el nombre del usuario asignado es: " + user.getName() + "      correo: " + user.getEmail());
                        }
                    }
                } else {
                    for (Object item : n.getBnRole().getBnUsers()) {
                        BnUserLocal user = (BnUserLocal) item;
                        mails.add(user.getEmail());
                        System.out.println("el nombre del usuario: " + user.getName() + "      correo: " + user.getEmail());
                    }
                }
            } else {
                for (Object item : n.getBnRole().getBnUsers()) {
                    BnUserLocal user = (BnUserLocal) item;
                    mails.add(user.getEmail());
                    System.out.println("el nombre del usuario: " + user.getName() + "      correo: " + user.getEmail());
                }
            }
            String mailAdmin = "kabad@fiec.espol.edu.ec";
            BonitaServiceLocator serviceLocator = BonitaServiceLocator.getInstance();
            Session session;
            System.out.println("Service locator");
            session = (Session) serviceLocator.getMailSession(BonitaServiceLocator.Services.MAIL_SERVICE);
            System.out.println("Ya obtubo la session");
            MimeMessage m = new MimeMessage(session);
            m.setFrom();

//            Vector<InternetAddress> direcciones = new Vector<InternetAddress>();
            InternetAddress[] direcciones = new InternetAddress[mails.size()];
            int i = 0;
            for (String mail : mails) {
                System.out.println("los mails:  " + mail);
                direcciones[i] = new InternetAddress(mail);
                i++;
            }
//            Address[] to = new InternetAddress[]{new InternetAddress(mails)};
            Address[] to = direcciones;

            System.out.println("Direccion: " + to[0]);
            m.setRecipients(javax.mail.Message.RecipientType.TO, to);

            Address[] cc = new InternetAddress[]{new InternetAddress(mailAdmin)};
            System.out.println("Direccion CC: " + cc[0]);
            m.setRecipients(javax.mail.Message.RecipientType.CC, cc);

            m.setSubject("[Sistema SolicitudesFIEC] Nueva actividad pendiente: "+ nombreModelo +": "+ nodeName);
            m.setSentDate(new java.util.Date());
            //solicitante deberia ser el nombre obtenido de la base de datos.
            String solicitante= "- Solicitante: " + project.getCreator() + "\n";
            String tipoSolicitud="- Tipo de solicitud: " +   nombreModelo + "\n";
            String actividad="- Actividad: " + nodeName + "\n";
            String content = "Nueva actividad pendiente.\n\n"+ solicitante + tipoSolicitud + actividad +
                    "\n\n Para realizarla, dirijase a la sección 'Actividades Pendientes' en http://www.fiec.espol.edu.ec/Solicitudes_FIEC ";
            m.setContent(content, "text/plain");
// Sending email
            
//            Transport.send(m);
            System.out.println("Email was successfully sent");
        } catch (BonitaServiceException e) {
            System.out.print(e.getMessage());
            System.out.println("mail service error: " + e);
            e.printStackTrace();
        } catch (MessagingException m) {
            System.out.println("Mensaje exception: " + m.getMessage());
        } catch (Exception e) {
            System.out.print(e.getMessage());
            System.out.println("*****mail service error: " + e);
            e.printStackTrace();
        }
    }

    public void beforeTerminate(Object b, BnNodeLocal n) throws HeroHookException {
    }
}
